home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / hobbes3 / bitblt.asm < prev    next >
Assembly Source File  |  1992-08-24  |  18KB  |  488 lines

  1. include hobbes.inc
  2. include extrn.inc
  3.  
  4.  
  5. .DATA
  6.  
  7. ; Plane masks for clipping left and right edges of rectangle
  8. LeftClipPlaneMask       db      00fh,00eh,00ch,008h
  9. RightClipPlaneMask      db      00fh,001h,003h,007h
  10.  
  11.  
  12. .CODE
  13.  
  14. ;----------------------------------------------------------------------------
  15. ;    void CopyScreenToScreenMaskedX(int SourceStartX,
  16. ;       int SourceStartY, int SourceEndX, int SourceEndY,
  17. ;       int DestStartX, int DestStartY, MaskedImage * Source,
  18. ;       unsigned int DestPageBase, int DestBitmapWidth);
  19.  
  20.         .code
  21.         public  _CopyScreenToScreenMaskedX
  22. _CopyScreenToScreenMaskedX proc far
  23. ARG SourceStartX, SourceStartY, SourceEndX, SourceEndY, DestStartX, DestStartY, \
  24.     ImageWidth, ImagePtr, MaskPtr:DWORD
  25. LOCAL SourceNextScanOffset, DestNextScanOffset, RectAddrWidth, \
  26.         RectHeight, SourceBitmapWidth = LocalStack
  27.         push    bp
  28.         mov     bp,sp
  29.         sub     sp,LocalStack
  30.         push    si
  31.         push    di
  32.         push    ds
  33.         mov        ax,@data
  34.         mov        ds,ax
  35.  
  36.         cld
  37.         mov     dx,GC_INDEX     ;set the bit mask to select all bits
  38.         mov     ax,00000h+BIT_MASK ; from the latches and none from
  39.         out     dx,ax           ; the CPU, so that we can write the
  40.                                 ; latch contents directly to memory
  41.         mov     ax,_ModeX_Segment       ;point ES to display memory
  42.         mov     es,ax
  43.         mov     ax,_Virtual_Width_Addr
  44. ;        shr     ax,1            ;convert to width in addresses
  45. ;        shr     ax,1
  46.         mul     DestStartY ;top dest rect scan line
  47.         mov     di,DestStartX
  48.         mov     si,di
  49.         shr     di,1    ;X/4 = offset of first dest rect pixel in
  50.         shr     di,1    ; scan line
  51.         add     di,ax   ;offset of first dest rect pixel in page
  52.         add     di,_Draw_Offset ;offset of first dest rect pixel
  53.                         ; in display memory. now look up the image that's
  54.                         ; aligned to match left-edge alignment of destination
  55.         and     si,3    ;DestStartX modulo 4
  56.         mov     cx,si   ;set aside alignment for later
  57.         shl     si,1    ;prepare for word look-up
  58. ;*******vvvvvv
  59. ;        mov     bx,Source] ;point to source MaskedImage structure
  60. ;        mov     bx,[bx+Alignments+si] ;point to AlignedMaskedImage
  61. ;                        ; struc for current left edge alignment
  62. ;        mov     ax,[bx+ImageWidth] ;image width in addresses
  63. ;        mov     SourceBitmapWidth],ax ;remember image width in
  64. ;                                          ; addresses
  65. ;        mul     SourceStartY] ;top source rect scan line
  66. ;        push    es
  67. ;        les        bx,Source
  68. ;        mov        bx,es:[bx+Alignments+si]
  69.         mov        ax,ImageWidth
  70.         mov        SourceBitmapWidth,ax
  71.         mul        SourceStartY
  72. ;*******^^^^^^
  73.         mov     si,SourceStartX
  74.         shr     si,1    ;X/4 = address of first source rect pixel in
  75.         shr     si,1    ; scan line
  76.         add     si,ax   ;offset of first source rect pixel in image
  77.         mov     ax,si
  78. ;*******vvvvvv
  79. ;        add     si,[bx+MaskPtr] ;point to mask offset of first mask pixel in DS
  80. ;        mov     bx,[bx+ImagePtr] ;offset of first source rect pixel
  81. ;        add        si,es:[bx+MaskPtr]
  82. ;        mov        bx,es:[bx+ImagePtr]
  83.         mov        bx,ImagePtr
  84. ;        pop        es
  85. ;*******^^^^^^
  86.         add     bx,ax            ; in display memory
  87.  
  88.         mov     ax,SourceStartX ;calculate # of addresses across
  89.         add     ax,cx                ; rect, shifting if necessary to
  90.         add     cx,SourceEndX   ; account for alignment
  91.         cmp     cx,ax
  92.         jle     CopyDone        ;skip if 0 or negative width
  93.         add     cx,3
  94.         and     ax,not 011b
  95.         sub     cx,ax
  96.         shr     cx,1
  97.         shr     cx,1    ;# of addresses across rectangle to copy
  98.         mov     ax,SourceEndY
  99.         sub     ax,SourceStartY  ;AX = height of rectangle
  100.         jle     CopyDone        ;skip if 0 or negative height
  101.         mov     RectHeight,ax
  102.         mov     ax,_Virtual_Width_Addr
  103. ;        shr     ax,1            ;convert to width in addresses
  104. ;        shr     ax,1
  105.         sub     ax,cx ;distance from end of one dest scan line to start of next
  106.         mov     DestNextScanOffset,ax
  107.         mov     ax,SourceBitmapWidth ;width in addresses
  108.         sub     ax,cx ;distance from end of source scan line to start of next
  109.         mov     SourceNextScanOffset,ax
  110.         mov     RectAddrWidth,cx ;remember width in addresses
  111.  
  112.         mov     dx,SC_INDEX
  113.         mov     al,MAP_MASK
  114.         out     dx,al           ;point SC Index register to Map Mask
  115.         inc     dx              ;point to SC Data register
  116. ;********
  117.         lds        si,MaskPtr
  118. ;********
  119. CopyRowsLoop:
  120.         mov     cx,RectAddrWidth ;width across
  121. CopyScanLineLoop:
  122.         lodsb                   ;get the mask for this four-pixel set
  123.                                 ; and advance the mask pointer
  124.         out     dx,al           ;set the mask
  125.         mov     al,es:[bx]      ;load the latches with 4-pixel set from source
  126.         mov     es:[di],al      ;copy the four-pixel set to the dest
  127.         inc     bx              ;advance the source pointer
  128.         inc     di              ;advance the destination pointer
  129.         dec     cx              ;count off four-pixel sets
  130.         jnz     CopyScanLineLoop
  131.  
  132.         mov     ax,SourceNextScanOffset
  133.         add     si,ax                      ;point to the start of
  134.         add     bx,ax                      ; the next source, mask,
  135.         add     di,DestNextScanOffset ; and dest lines
  136.         dec     word ptr RectHeight ;count down scan lines
  137.         jnz     CopyRowsLoop
  138. CopyDone:
  139.         mov     dx,GC_INDEX+1   ;restore the bit mask to its default,
  140.         mov     al,0ffh         ; which selects all bits from the CPU
  141.         out     dx,al           ; and none from the latches (the GC
  142.                                 ; Index still points to Bit Mask)
  143.         pop        ds
  144.         pop     di      ;restore caller's register variables
  145.         pop     si
  146.         mov     sp,bp   ;discard storage for local variables
  147.         pop     bp      ;restore caller's stack frame
  148.         ret
  149. _CopyScreenToScreenMaskedX endp
  150.  
  151.  
  152.  
  153. ;----------------------------------------------------------------------------
  154. ;    void CopyScreenToScreen(int SourceStartX, int SourceStartY,
  155. ;       int SourceEndX, int SourceEndY, int DestStartX,
  156. ;       int DestStartY, unsigned int SourcePageBase,
  157. ;       unsigned int DestPageBase, int SourceBitmapWidth,
  158. ;       int DestBitmapWidth);
  159.  
  160.         public  _CopyScreenToScreen
  161. _CopyScreenToScreen proc    far
  162. ARG @@SourceStartX:WORD, @@SourceStartY:WORD, @@SourceEndX:WORD, @@SourceEndY:WORD, \
  163.     @@DestStartX:WORD, @@DestStartY:WORD,                                        \
  164.     @@SourcePageBase:WORD, @@DestPageBase:WORD, @@SourceWidth:WORD, @@DestWidth:WORD
  165. LOCAL SourceNextScanOffset:WORD, DestNextScanOffset:WORD,                \
  166.     RectAddrWidth:WORD, Height:WORD = LocalStack
  167.         push    bp
  168.         mov     bp,sp
  169.         sub     sp,LocalStack
  170.         push    si
  171.         push    di
  172.         push    ds
  173.         mov        ax,@data
  174.         mov        ds,ax
  175.  
  176.         cld
  177.         mov     dx,GC_INDEX     ;set the bit mask to select all bits
  178.         mov     ax,00000h+BIT_MASK ; from the latches and none from
  179.         out     dx,ax           ; the CPU, so that we can write the
  180.                                 ; latch contents directly to memory
  181.         mov     ax,_ModeX_Segment           ;point ES to display memory
  182.         mov     es,ax
  183.         mov     ax,@@DestWidth
  184.         shr     ax,1            ;convert to width in addresses
  185.         shr     ax,1
  186.         mul     @@DestStartY ;top dest rect scan line
  187.         mov     di,@@DestStartX
  188.         shr     di,1            ;X/4 = offset of first dest rect pixel in
  189.         shr     di,1            ; scan line
  190.         add     di,ax           ;offset of first dest rect pixel in page
  191.         add     di,@@DestPageBase ;offset of first dest rect pixel
  192.                                 ; in display memory
  193.         mov     ax,@@SourceWidth
  194.         shr     ax,1            ;convert to width in addresses
  195.         shr     ax,1
  196.         mul     @@SourceStartY ;top source rect scan line
  197.         mov     si,@@SourceStartX
  198.         mov     bx,si
  199.         shr     si,1    ;X/4 = offset of first source rect pixel in
  200.         shr     si,1    ; scan line
  201.         add     si,ax   ;offset of first source rect pixel in page
  202.         add     si,@@SourcePageBase     ;offset of first source rect
  203.                                     ; pixel in display memory
  204.         and     bx,0003h                 ;look up left edge plane mask
  205.         mov     ah,LeftClipPlaneMask[bx] ; to clip
  206.         mov     bx,@@SourceEndX
  207.         and     bx,0003h                  ;look up right edge plane
  208.         mov     al,RightClipPlaneMask[bx] ; mask to clip
  209.         mov     bx,ax                   ;put the masks in BX
  210.  
  211.         mov     cx,@@SourceEndX       ;calculate # of addresses across
  212.         mov     ax,@@SourceStartX     ; rect
  213.         cmp     cx,ax
  214.         jle     @@CopyDone            ;skip if 0 or negative width
  215.         dec     cx
  216.         and     ax,not 011b
  217.         sub     cx,ax
  218.         shr     cx,1
  219.         shr     cx,1    ;# of addresses across rectangle to copy - 1
  220.         jnz     @@MasksSet ;there's more than one address to draw
  221.         and     bh,bl   ;there's only one address, so combine the left
  222.                         ; and right edge clip masks
  223. @@MasksSet:
  224.         mov     ax,@@SourceEndY
  225.         sub     ax,@@SourceStartY  ;AX = height of rectangle
  226.         jle     @@CopyDone        ;skip if 0 or negative height
  227.         mov     Height,ax
  228.         mov     ax,@@DestWidth
  229.         shr     ax,1            ;convert to width in addresses
  230.         shr     ax,1
  231.         sub     ax,cx   ;distance from end of one dest scan line to
  232.         dec     ax      ; start of next
  233.         mov     DestNextScanOffset,ax
  234.         mov     ax,@@SourceWidth
  235.         shr     ax,1            ;convert to width in addresses
  236.         shr     ax,1
  237.         sub     ax,cx   ;distance from end of one source scan line to
  238.         dec     ax      ; start of next
  239.         mov     SourceNextScanOffset,ax
  240.         mov     RectAddrWidth,cx ;remember width in addresses - 1
  241.         mov     dx,SC_INDEX+1 ;point to Sequence Controller Data reg
  242.                                 ; (SC Index still points to Map Mask)
  243.         mov     ax,es   ;DS=ES=screen segment for MOVS
  244.         mov     ds,ax
  245. @@CopyRowsLoop:
  246.         mov     cx,RectAddrWidth ;width across - 1
  247.         mov     al,bh   ;put left-edge clip mask in AL
  248.         out     dx,al   ;set the left-edge plane (clip) mask
  249.         movsb           ;copy the left edge (pixels go through
  250.                         ; latches)
  251.         dec     cx      ;count off left edge address
  252.         js      @@CopyLoopBottom ;that's the only address
  253.         jz      @@DoRightEdge ;there are only two addresses
  254.         mov     al,00fh ;middle addresses are drawn 4 pixels at a pop
  255.         out     dx,al   ;set the middle pixel mask to no clip
  256.         rep     movsb   ;draw the middle addresses four pixels apiece
  257.                         ; (pixels copied through latches)
  258. @@DoRightEdge:
  259.         mov     al,bl   ;put right-edge clip mask in AL
  260.         out     dx,al   ;set the right-edge plane (clip) mask
  261.         movsb           ;draw the right edge (pixels copied through
  262.                         ; latches)
  263. @@CopyLoopBottom:
  264.         add     si,SourceNextScanOffset ;point to the start of
  265.         add     di,DestNextScanOffset      ; next source & dest lines
  266.         dec     word ptr Height         ;count down scan lines
  267.         jnz     @@CopyRowsLoop
  268. @@CopyDone:
  269.         mov     dx,GC_INDEX+1         ;restore the bit mask to its default,
  270.         mov     al,0ffh             ; which selects all bits from the CPU
  271.         out     dx,al               ; and none from the latches (the GC
  272.                                     ; Index still points to Bit Mask)
  273.         pop     ds
  274.         pop     di
  275.         pop     si
  276.         mov     sp,bp
  277.         pop     bp
  278.         ret
  279. _CopyScreenToScreen endp
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286. ;----------------------------------------------------------------------------
  287. ;    void CopySystemToScreen(int SourceStartX, int SourceStartY,
  288. ;       int SourceEndX, int SourceEndY, int DestStartX,
  289. ;       int DestStartY, char* SourcePtr, unsigned int DestPageBase,
  290. ;       int SourceBitmapWidth, int DestBitmapWidth);
  291.  
  292.         public  _CopySystemToScreen
  293. _CopySystemToScreen proc far
  294. ARG SourceStartX:WORD, SourceStartY:WORD, SourceEndX:WORD, SourceEndY:WORD, \
  295.     DestStartX:WORD, DestStartY:WORD, SourcePtr:DWORD, DestPageBase:WORD,     \
  296.     SourceWidth:WORD, DestWidth:WORD
  297. LOCAL RectWidth:WORD, LeftMask:WORD = LocalStack
  298.         push    bp
  299.         mov     bp,sp
  300.         sub     sp,LocalStack
  301.         push    si
  302.         push    di
  303.         push    ds
  304.         mov        ax,@data
  305.         mov        ds,ax
  306.  
  307.         cld
  308.         mov     ax,_ModeX_Segment       ;point ES to display memory
  309.         mov     es,ax
  310.         mov     ax,SourceWidth
  311.         mul     SourceStartY         ;top source rect scan line
  312.         add     ax,SourceStartX
  313. ;*********
  314. ;        add     ax,SourcePtr         ;offset of first source rect pixel
  315.         lds        bx,SourcePtr
  316.         add        ax,bx
  317. ;*********
  318.         mov     si,ax                 ; in DS
  319.  
  320.         mov     ax,DestWidth
  321.         shr     ax,1            ;convert to width in addresses
  322.         shr     ax,1
  323.         mov     DestWidth,ax         ;remember address width
  324.         mul     DestStartY             ;top dest rect scan line
  325.         mov     di,DestStartX
  326.         mov     cx,di
  327.         shr     di,1            ;X/4 = offset of first dest rect pixel in
  328.         shr     di,1            ; scan line
  329.         add     di,ax           ;offset of first dest rect pixel in page
  330.         add     di,DestPageBase ;offset of first dest rect pixel
  331.                                 ; in display memory
  332.         and     cl,011b         ;CL = first dest pixel's plane
  333.         mov     al,11h          ;upper nibble comes into play when plane wraps
  334.                                 ; from 3 back to 0
  335.         shl     al,cl           ;set the bit for the first dest pixel's plane
  336.         cbw
  337.         mov     LeftMask,ax     ; in each nibble to 1
  338.  
  339.         mov     cx,SourceEndX      ;calculate # of pixels across
  340.         sub     cx,SourceStartX ; rect
  341.         jle     @@CopyDone        ;skip if 0 or negative width
  342.         mov     RectWidth,cx
  343.         mov     bx,SourceEndY
  344.         sub     bx,SourceStartY ;BX = height of rectangle
  345.         jle     @@CopyDone        ;skip if 0 or negative height
  346.         mov     dx,SC_INDEX     ;point to SC Index register
  347.         mov     al,MAP_MASK
  348.         out     dx,al           ;point SC Index reg to the Map Mask
  349.         inc     dx              ;point DX to SC Data reg
  350. @@CopyRowsLoop:
  351.         mov     ax,LeftMask
  352.         mov     cx,RectWidth
  353.         push    si      ;remember the start offset in the source
  354.         push    di      ;remember the start offset in the dest
  355. @@CopyScanLineLoop:
  356.         out     dx,al           ;set the plane for this pixel
  357.         movsb                   ;copy the pixel to the screen
  358.         rol     al,1            ;set mask for next pixel's plane
  359.         cmc                     ;advance destination address only when
  360.         sbb     di,0            ; wrapping from plane 3 to plane 0
  361.                                 ; (else undo INC DI done by MOVSB)
  362.         loop    @@CopyScanLineLoop
  363.         pop     di                  ;retrieve the dest start offset
  364.         add     di,DestWidth        ;point to the start of the
  365.                                         ; next scan line of the dest
  366.         pop     si                      ;retrieve the source start offset
  367.         add     si,SourceWidth             ;point to the start of the
  368.                                         ; next scan line of the source
  369.         dec     bx                      ;count down scan lines
  370.         jnz     @@CopyRowsLoop
  371. @@CopyDone:
  372.         pop        ds
  373.         pop     di
  374.         pop     si
  375.         mov     sp,bp
  376.         pop     bp
  377.         ret
  378. _CopySystemToScreen endp
  379.  
  380.  
  381.  
  382.  
  383.  
  384. ;----------------------------------------------------------------------------
  385. ;    void CopySystemToScreenMasked(int SourceStartX,
  386. ;       int SourceStartY, int SourceEndX, int SourceEndY,
  387. ;       int DestStartX, int DestStartY, char * SourcePtr,
  388. ;       unsigned int DestPageBase, int SourceBitmapWidth,
  389. ;       int DestBitmapWidth, char * MaskPtr);
  390.  
  391.         .code
  392.         public  _CopySystemToScreenMasked
  393. _CopySystemToScreenMasked proc far
  394. ARG SourceStartX:WORD, SourceStartY:WORD, SourceEndX:WORD, SourceEndY:WORD, \
  395.     DestStartX:WORD, DestStartY:WORD, SourcePtr:WORD, DestPageBase:WORD,     \
  396.     SourceWidth:WORD, DestWidth:WORD, MaskP:WORD
  397. LOCAL RectWidth:WORD, RectHeight:WORD, LeftMask:WORD = LocalStack
  398.         push    bp
  399.         mov     bp,sp
  400.         sub     sp,LocalStack
  401.         push    si
  402.         push    di
  403.         push    ds
  404.         mov        ax,@data
  405.         mov        ds,ax
  406.  
  407.         mov     ax,_ModeX_Segment   ;point ES to display memory
  408.         mov     es,ax
  409.         mov     ax,SourceWidth
  410.         mul     SourceStartY ;top source rect scan line
  411.         add     ax,SourceStartX
  412.         mov     bx,ax
  413.         add     ax,SourcePtr ;offset of first source rect pixel
  414.         mov     si,ax             ; in DS
  415.         add     bx,MaskP ;offset of first mask pixel in DS
  416.  
  417.         mov     ax,DestWidth
  418.         shr     ax,1            ;convert to width in addresses
  419.         shr     ax,1
  420.         mov     DestWidth,ax ;remember address width
  421.         mul     DestStartY ;top dest rect scan line
  422.         mov     di,DestStartX
  423.         mov     cx,di
  424.         shr     di,1    ;X/4 = offset of first dest rect pixel in
  425.         shr     di,1    ; scan line
  426.         add     di,ax   ;offset of first dest rect pixel in page
  427.         add     di,DestPageBase ;offset of first dest rect pixel
  428.                         ; in display memory
  429.         and     cl,011b ;CL = first dest pixel's plane
  430.         mov     al,11h  ;upper nibble comes into play when plane wraps
  431.                         ; from 3 back to 0
  432.         shl     al,cl   ;set the bit for the first dest pixel's plane
  433.         cbw
  434.         mov     LeftMask,ax ; in each nibble to 1
  435.  
  436.         mov     ax,SourceEndX   ;calculate # of pixels across
  437.         sub     ax,SourceStartX ; rect
  438.         jle     @@CopyDone        ;skip if 0 or negative width
  439.         mov     RectWidth,ax
  440.         sub     word ptr SourceWidth,ax
  441.                     ;distance from end of one source scan line to start of next
  442.         mov     ax,SourceEndY
  443.         sub     ax,SourceStartY ;height of rectangle
  444.         jle     @@CopyDone        ;skip if 0 or negative height
  445.         mov     RectHeight,ax
  446.         mov     dx,SC_INDEX     ;point to SC Index register
  447.         mov     al,MAP_MASK
  448.         out     dx,al           ;point SC Index reg to the Map Mask
  449.         inc     dx              ;point DX to SC Data reg
  450. @@CopyRowsLoop:
  451.         mov     ax,LeftMask
  452.         mov     cx,RectWidth
  453.         push    di      ;remember the start offset in the dest
  454. @@CopyScanLineLoop:
  455.         cmp     byte ptr [bx],0 ;is this pixel mask-enabled?
  456.         jz      @@MaskOff         ;no, so don't draw it
  457.                                 ;yes, draw the pixel
  458.         out     dx,al           ;set the plane for this pixel
  459.         mov     ah,[si]         ;get the pixel from the source
  460.         mov     es:[di],ah      ;copy the pixel to the screen
  461. @@MaskOff:
  462.         inc     bx              ;advance the mask pointer
  463.         inc     si              ;advance the source pointer
  464.         rol     al,1            ;set mask for next pixel's plane
  465.         adc     di,0            ;advance destination address only when
  466.                                 ; wrapping from plane 3 to plane 0
  467.         loop    @@CopyScanLineLoop
  468.         pop     di              ;retrieve the dest start offset
  469.         add     di,DestWidth ;point to the start of the
  470.                                         ; next scan line of the dest
  471.         add     si,SourceWidth ;point to the start of the
  472.                                         ; next scan line of the source
  473.         add     bx,SourceWidth ;point to the start of the
  474.                                         ; next scan line of the mask
  475.         dec     word ptr RectHeight ;count down scan lines
  476.         jnz     @@CopyRowsLoop
  477. @@CopyDone:
  478.         pop        ds
  479.         pop     di
  480.         pop     si
  481.         mov     sp,bp
  482.         pop     bp
  483.         ret
  484. _CopySystemToScreenMasked endp
  485.  
  486.  
  487. ;----------------------------------------------------------------------------
  488. END